/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package domain;

import data.FileControllerD;
import data.UserController;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author oriol.cano
 */
public class DictionaryController {
    private static String _path;
    private static String _sep = System.getProperty("file.separator");


	public DictionaryController() {
//		String jarPath = System.getProperty("java.class.path");
//		int lastSlash = jarPath.lastIndexOf(_sep);
//		_path = jarPath.substring(0,lastSlash + 1);

       String jarPath = System.getProperty("java.class.path");
       int lastDot = jarPath.lastIndexOf(";");
       String aux = jarPath;
       if (lastDot != -1) {
            aux = jarPath.substring(0, lastDot);
       }
       int lastSlash = aux.lastIndexOf(_sep);
       _path = aux.substring(0,lastSlash + 1);
	}
    
    public TestDictionary createNounDictionary(int userID) {
        String textAlpha = readTextAlpha(); //SENSE SIGNES O CLEANSTRING
	    TextAlpha ta = new TextAlpha(textAlpha);
        Model model = new Model(ta);
        readModel(model, userID);
        TestDictionary NounDictionary = new TestDictionary(model);
        readDictionary(NounDictionary);
        return NounDictionary;
    }

     public VerbDictionary createVerbDictionary(int userID) {
        UserController _uc = new UserController();
        BufferedReader added = _uc.getVerbs(userID);
		FileControllerD _fc = new FileControllerD();
		BufferedReader verbs = _fc.getFileR(_path+"files"+_sep+"verbs.txt");
		BufferedReader irregulars = _fc.getFileR(_path+"files"+_sep+"irregulars.txt");
        VerbDictionary _vd = new VerbDictionary();
        _vd.inicialize(verbs, irregulars, added);
		try {
			if(added != null) added.close();
			verbs.close();
			irregulars.close();
		} catch (IOException ex) {
			//Logger.getLogger(DictionaryController.class.getName()).log(Level.SEVERE, null, ex);
		}
		
        return _vd;
    }
    /*protected Model createModel() {
        String textAlpha = readTextAlpha(); //SENSE SIGNES O CLEANSTRING
	TextAlpha ta = new TextAlpha(textAlpha);
        Model model = new Model(ta);
        readModel(model);
        return model;
    }*/
    
    
    private void readDictionary(TestDictionary NounDictionary) {
        String noun = null;
        FileControllerD fc = new FileControllerD();
        BufferedReader input = fc.getFileR(_path + "files" + _sep + "nouns.txt");
        try {
            noun = input.readLine();
        } catch (IOException ex) {
            Logger.getLogger(DictionaryController.class.getName()).log(Level.SEVERE, null, ex);
        }
        while(noun != null) {
            try {
					NounDictionary.addWord(noun);
                    noun = input.readLine();
            }
            catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

   

    private static void readModel(Model model, int userID) {

		String parella = null;
		String first = null;
		String second = null;
        String user = userID+"";
		ArrayList<Pair<String, String>> training = new ArrayList<Pair<String, String>>();
		StringTokenizer tokens = null;

		FileControllerD fc = new FileControllerD();
                BufferedReader input = fc.getFileR(_path + "files" + _sep + "training.txt");

		try {
			parella = input.readLine();
		}
		catch (IOException ex) {
			Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
		}
		while (parella != null) {
			tokens = new StringTokenizer(parella);
			if (tokens.hasMoreTokens()) {
				second = tokens.nextToken(); ///SWAP FET
				first = tokens.nextToken();
				if (!first.equals(second)) {
					Pair<String,String> pair = new Pair<String,String>(first, second);
					training.add(pair);
				}
			}

			try {
				parella = input.readLine();
			}
			catch (IOException ex) {
				Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
			}

		}

        if (userID != 0) {
            input = fc.getFileR(_path + "users" + _sep + user + _sep + "usertraining.txt");

            try {
                parella = input.readLine();
            }
            catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }

            while (parella != null) {
                tokens = new StringTokenizer(parella);
                if (tokens.hasMoreTokens()) {
                    second = tokens.nextToken(); ///SWAP FET
                    first = tokens.nextToken();
                    if (!first.equals(second)) {
                        Pair<String,String> pair = new Pair<String,String>(first, second);
                        training.add(pair);
                    }
                }

                try {
                    parella = input.readLine();
                }
                catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        }
		model.generateModel(training);
	}

    private String readTextAlpha() {
        String linia = null;
		String text = "";

		FileControllerD fc = new FileControllerD();
        BufferedReader input = fc.getFileR(_path + "files" + _sep + "textalpha.txt");

		try {
			linia = input.readLine();
		}
		catch (IOException ex) {
			Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
		}
		Boolean primer = true;

		while(linia != null) {

			if (primer) {
				text = linia;
				primer = false;
			}
			else {
				text = text + " " + linia;
			}

			try {
				linia = input.readLine();
			}
			catch (IOException ex) {
				Logger.getLogger(VerbDictionary.class.getName()).log(Level.SEVERE, null, ex);
			}
		}

		return text;
    }

    public void addVerbToDictionary(String s, int userID) {
        try {

        String user = userID+"";
        FileControllerD _fc = new FileControllerD();
        BufferedWriter _output = _fc.getFileW(_path+"users"+_sep+user+_sep+"added.txt");

       _output.append(s);
       _output.newLine();
       _output.close();


       }
       catch(Exception e) {
          /* String user = userID+"";
           File aux = new File(_path+"users"+_sep+user);
		   boolean b = aux.mkdir();
		   File _file = new File(_path+"users"+_sep+user+_sep+"added.txt");

            try {
                b = _file.createNewFile();
                _output = _fc.getFileW(_path+"users"+_sep+user+_sep+"added.txt");

                _output.append(s);
                _output.newLine();
                _output.close();
                 includeVerb(s);
            } catch (IOException ex) {
                Logger.getLogger(VerbDictionary.class.getName()).log(Level.SEVERE, null, ex);
            }
           //_file = _fc.getFile("."+_sep+"users"+_sep+user+_sep+"added.txt");



        //Logger.getLogger(VerbDictionary.class.getName()).log(Level.SEVERE, null, e);
       */}
    }

    public void addTrainingPair(String noun, String infinitive, int userID) {
        try {

        String user = userID+"";
        FileControllerD _fc = new FileControllerD();
        BufferedWriter _output = _fc.getFileW(_path+"users"+_sep+user+_sep+"usertraining.txt");

		for (int i = 0; i < 5; ++i) {
		   _output.append(noun+" "+infinitive);
		   _output.newLine();
		}
		_output.close();


       }
       catch(Exception e) {

       }
    }

}
